<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vR342dDDCVL390d_BeWVgTaW7ZOSPKUScpWF9wGZcQdN_BiXT2-Fx3fDe81La8nIODpq46b9F1W5dOa/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - January 16 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - January 16 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_awaubl1dt4sa-1>li:before{content:"\0025cb  "}.lst-kix_awaubl1dt4sa-3>li:before{content:"\0025cf  "}.lst-kix_awaubl1dt4sa-0>li:before{content:"\0025cf  "}.lst-kix_awaubl1dt4sa-4>li:before{content:"\0025cb  "}ul.lst-kix_7vglcg73d4n9-0{list-style-type:none}ul.lst-kix_7vglcg73d4n9-1{list-style-type:none}.lst-kix_awaubl1dt4sa-2>li:before{content:"\0025a0  "}.lst-kix_uxjb3yk7lvzs-7>li:before{content:"\0025cb  "}.lst-kix_uxjb3yk7lvzs-6>li:before{content:"\0025cf  "}.lst-kix_uxjb3yk7lvzs-8>li:before{content:"\0025a0  "}.lst-kix_uxjb3yk7lvzs-5>li:before{content:"\0025a0  "}.lst-kix_awaubl1dt4sa-8>li:before{content:"\0025a0  "}.lst-kix_370ls6mrbws7-0>li:before{content:"\0025cf  "}.lst-kix_370ls6mrbws7-1>li:before{content:"\0025cb  "}.lst-kix_awaubl1dt4sa-5>li:before{content:"\0025a0  "}.lst-kix_awaubl1dt4sa-7>li:before{content:"\0025cb  "}.lst-kix_370ls6mrbws7-2>li:before{content:"\0025a0  "}.lst-kix_awaubl1dt4sa-6>li:before{content:"\0025cf  "}.lst-kix_7vglcg73d4n9-1>li:before{content:"\0025cb  "}.lst-kix_7vglcg73d4n9-0>li:before{content:"\0025cf  "}.lst-kix_rm58aqw1xfkx-8>li:before{content:"\0025a0  "}.lst-kix_rm58aqw1xfkx-7>li:before{content:"\0025cb  "}.lst-kix_nn9inttg9e2i-4>li:before{content:"\0025cb  "}.lst-kix_rm58aqw1xfkx-4>li:before{content:"\0025cb  "}.lst-kix_7vglcg73d4n9-8>li:before{content:"\0025a0  "}.lst-kix_nn9inttg9e2i-5>li:before{content:"\0025a0  "}.lst-kix_rm58aqw1xfkx-5>li:before{content:"\0025a0  "}.lst-kix_7vglcg73d4n9-7>li:before{content:"\0025cb  "}.lst-kix_nn9inttg9e2i-6>li:before{content:"\0025cf  "}.lst-kix_rm58aqw1xfkx-6>li:before{content:"\0025cf  "}.lst-kix_rm58aqw1xfkx-2>li:before{content:"\0025a0  "}.lst-kix_rm58aqw1xfkx-3>li:before{content:"\0025cf  "}.lst-kix_370ls6mrbws7-8>li:before{content:"\0025a0  "}.lst-kix_nn9inttg9e2i-8>li:before{content:"\0025a0  "}.lst-kix_nn9inttg9e2i-7>li:before{content:"\0025cb  "}.lst-kix_370ls6mrbws7-4>li:before{content:"\0025cb  "}.lst-kix_370ls6mrbws7-5>li:before{content:"\0025a0  "}.lst-kix_7vglcg73d4n9-2>li:before{content:"\0025a0  "}.lst-kix_7vglcg73d4n9-3>li:before{content:"\0025cf  "}.lst-kix_370ls6mrbws7-3>li:before{content:"\0025cf  "}.lst-kix_370ls6mrbws7-7>li:before{content:"\0025cb  "}.lst-kix_7vglcg73d4n9-5>li:before{content:"\0025a0  "}.lst-kix_rm58aqw1xfkx-0>li:before{content:"\0025cf  "}.lst-kix_rm58aqw1xfkx-1>li:before{content:"\0025cb  "}.lst-kix_7vglcg73d4n9-4>li:before{content:"\0025cb  "}.lst-kix_7vglcg73d4n9-6>li:before{content:"\0025cf  "}.lst-kix_370ls6mrbws7-6>li:before{content:"\0025cf  "}ul.lst-kix_uxjb3yk7lvzs-6{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-5{list-style-type:none}.lst-kix_8nueidazwhlh-4>li:before{content:"\0025cb  "}.lst-kix_8nueidazwhlh-5>li:before{content:"\0025a0  "}ul.lst-kix_uxjb3yk7lvzs-8{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-7{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-2{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-1{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-4{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-3{list-style-type:none}.lst-kix_8nueidazwhlh-1>li:before{content:"\0025cb  "}ul.lst-kix_nn9inttg9e2i-8{list-style-type:none}ul.lst-kix_nn9inttg9e2i-7{list-style-type:none}.lst-kix_8nueidazwhlh-2>li:before{content:"\0025a0  "}ul.lst-kix_nn9inttg9e2i-6{list-style-type:none}ul.lst-kix_nn9inttg9e2i-5{list-style-type:none}.lst-kix_8nueidazwhlh-3>li:before{content:"\0025cf  "}ul.lst-kix_nn9inttg9e2i-0{list-style-type:none}ul.lst-kix_nn9inttg9e2i-4{list-style-type:none}ul.lst-kix_nn9inttg9e2i-3{list-style-type:none}ul.lst-kix_nn9inttg9e2i-2{list-style-type:none}ul.lst-kix_nn9inttg9e2i-1{list-style-type:none}ul.lst-kix_uxjb3yk7lvzs-0{list-style-type:none}.lst-kix_8nueidazwhlh-0>li:before{content:"\0025cf  "}ul.lst-kix_8nueidazwhlh-8{list-style-type:none}ul.lst-kix_8nueidazwhlh-6{list-style-type:none}ul.lst-kix_8nueidazwhlh-7{list-style-type:none}ul.lst-kix_8nueidazwhlh-4{list-style-type:none}ul.lst-kix_8nueidazwhlh-5{list-style-type:none}ul.lst-kix_8nueidazwhlh-2{list-style-type:none}ul.lst-kix_8nueidazwhlh-3{list-style-type:none}ul.lst-kix_8nueidazwhlh-0{list-style-type:none}ul.lst-kix_8nueidazwhlh-1{list-style-type:none}.lst-kix_8nueidazwhlh-8>li:before{content:"\0025a0  "}.lst-kix_8nueidazwhlh-6>li:before{content:"\0025cf  "}.lst-kix_8nueidazwhlh-7>li:before{content:"\0025cb  "}.lst-kix_nn9inttg9e2i-3>li:before{content:"\0025cf  "}.lst-kix_nn9inttg9e2i-2>li:before{content:"\0025a0  "}.lst-kix_nn9inttg9e2i-0>li:before{content:"\0025cf  "}.lst-kix_nn9inttg9e2i-1>li:before{content:"\0025cb  "}ul.lst-kix_rm58aqw1xfkx-5{list-style-type:none}ul.lst-kix_rm58aqw1xfkx-4{list-style-type:none}.lst-kix_uxjb3yk7lvzs-0>li:before{content:"\0025cf  "}ul.lst-kix_rm58aqw1xfkx-3{list-style-type:none}ul.lst-kix_rm58aqw1xfkx-2{list-style-type:none}.lst-kix_uxjb3yk7lvzs-1>li:before{content:"\0025cb  "}ul.lst-kix_rm58aqw1xfkx-1{list-style-type:none}ul.lst-kix_rm58aqw1xfkx-0{list-style-type:none}.lst-kix_uxjb3yk7lvzs-3>li:before{content:"\0025cf  "}.lst-kix_uxjb3yk7lvzs-2>li:before{content:"\0025a0  "}.lst-kix_uxjb3yk7lvzs-4>li:before{content:"\0025cb  "}ul.lst-kix_rm58aqw1xfkx-8{list-style-type:none}ul.lst-kix_rm58aqw1xfkx-7{list-style-type:none}ul.lst-kix_rm58aqw1xfkx-6{list-style-type:none}ul.lst-kix_7vglcg73d4n9-4{list-style-type:none}ul.lst-kix_7vglcg73d4n9-5{list-style-type:none}ul.lst-kix_7vglcg73d4n9-2{list-style-type:none}ul.lst-kix_7vglcg73d4n9-3{list-style-type:none}ul.lst-kix_awaubl1dt4sa-0{list-style-type:none}ul.lst-kix_7vglcg73d4n9-8{list-style-type:none}ul.lst-kix_awaubl1dt4sa-1{list-style-type:none}ul.lst-kix_awaubl1dt4sa-2{list-style-type:none}ul.lst-kix_7vglcg73d4n9-6{list-style-type:none}ul.lst-kix_awaubl1dt4sa-3{list-style-type:none}ul.lst-kix_7vglcg73d4n9-7{list-style-type:none}ul.lst-kix_awaubl1dt4sa-4{list-style-type:none}ul.lst-kix_awaubl1dt4sa-5{list-style-type:none}ul.lst-kix_awaubl1dt4sa-6{list-style-type:none}ul.lst-kix_awaubl1dt4sa-7{list-style-type:none}ul.lst-kix_awaubl1dt4sa-8{list-style-type:none}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}ul.lst-kix_370ls6mrbws7-1{list-style-type:none}ul.lst-kix_370ls6mrbws7-0{list-style-type:none}ul.lst-kix_370ls6mrbws7-3{list-style-type:none}ul.lst-kix_370ls6mrbws7-2{list-style-type:none}ul.lst-kix_370ls6mrbws7-5{list-style-type:none}ul.lst-kix_370ls6mrbws7-4{list-style-type:none}ul.lst-kix_370ls6mrbws7-7{list-style-type:none}ul.lst-kix_370ls6mrbws7-6{list-style-type:none}ul.lst-kix_370ls6mrbws7-8{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c0{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c3{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c7{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c1{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c5{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c2{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c11{color:#000000;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c9{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c13{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c8{margin-left:72pt;padding-left:0pt}.c10{color:inherit;text-decoration:inherit}.c12{padding:0;margin:0}.c14{height:11pt}.c6{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c13"><h2 class="c2" id="h.gqakboe5iweg"><span class="c7">Participants</span></h2><p class="c4"><span class="c3">Alex Christensen, Philippe Le Hegaret, Nicolás Peña, Marcus Armstrong, Benjamin De Kosnik, Nic Jansma, Annie Sullivan, Andrew Comminos, Philip Walton, Ilya Grigorik, Yoav Weiss, Ryosuke Niwa, Nate Schloss</span></p><h2 class="c2" id="h.x89emcazrew4"><span class="c7">Admin</span></h2><h3 class="c1" id="h.nncacis2qu4l"><span class="c5">Next call </span></h3><ul class="c12 lst-kix_7vglcg73d4n9-0 start"><li class="c0 li-bullet-0"><span class="c3">Shifting to Thursday @ 10AM PST, bi-weekly cadence</span></li><li class="c0 li-bullet-0"><span class="c3">Next call is on January 30th, 10AM PST</span></li></ul><h3 class="c1" id="h.cgkeiwaboid0"><span class="c5">WebPerf F2F</span></h3><ul class="c12 lst-kix_8nueidazwhlh-0 start"><li class="c0 li-bullet-0"><span class="c3">April 2nd+3rd in Bay area</span></li></ul><ul class="c12 lst-kix_8nueidazwhlh-1 start"><li class="c4 c8 li-bullet-0"><span class="c3">Day 1: ~50~60 expected people</span></li><li class="c4 c8 li-bullet-0"><span class="c3">Day 2: ~25~30 core WG group</span></li></ul><ul class="c12 lst-kix_8nueidazwhlh-0"><li class="c0 li-bullet-0"><span class="c3">Space</span></li></ul><ul class="c12 lst-kix_8nueidazwhlh-1 start"><li class="c4 c8 li-bullet-0"><span><b>AI</b>: Followup w/ Andrew &amp; Nic on space logistics</span></li></ul><h3 class="c1" id="h.m4vkl1a0s7et"><span class="c5">WebPerf WG Charter 2020</span></h3><ul class="c12 lst-kix_awaubl1dt4sa-0 start"><li class="c0 li-bullet-0"><span class="c3">WebPerf charter expires in June 2020</span></li><li class="c0 li-bullet-0"><span class="c3">We'll need to re-charter by then</span></li><li class="c0 li-bullet-0"><span class="c3">April F2F can help guide our priorities for the new charter</span></li></ul><h2 class="c2" id="h.9y8ssnyo9k8g"><span class="c7">Largest Contentful Paint</span></h2><h3 class="c1" id="h.iotyiqxhsxyh"><span class="c9"><a class="c10" href="https://www.google.com/url?q=https://github.com/anniesullie/LCP_Examples/blob/master/removed_from_dom/README.md&amp;sa=D&amp;source=editors&amp;ust=1613234996804000&amp;usg=AOvVaw0kg_RRV5ciu-RoPhtLCJdE">Element removal research</a></span></h3><p class="c4 c14"><span class="c3"></span></p><ul class="c12 lst-kix_uxjb3yk7lvzs-0 start"><li class="c0 li-bullet-0"><span class="c3"><b>Annie</b>: Currently: LCP ignores elements that have been removed from the DOM (e.g. from splash-elements)</span></li></ul><ul class="c12 lst-kix_uxjb3yk7lvzs-1 start"><li class="c4 c8 li-bullet-0"><span class="c9"><a class="c10" href="https://www.google.com/url?q=https://github.com/WICG/largest-contentful-paint%23ignore-removed-elements&amp;sa=D&amp;source=editors&amp;ust=1613234996805000&amp;usg=AOvVaw2Gq-HXZ7h9j_mRZjcSJ36k">https://github.com/WICG/largest-contentful-paint#ignore-removed-elements</a></span></li></ul><ul class="c12 lst-kix_uxjb3yk7lvzs-0"><li class="c0 li-bullet-0"><span class="c3"><b>Annie</b>: However this may affect carousels which often rotate through images and remove old ones -- LCP would be for the "last" image in the carousel if it's rotating automatically</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Annie</b>: Other places where this breaks down is for header placeholders -- this seems OK as you'd want to wait for the "final" header to pop in to declare LCP</span></li><li class="c0 li-bullet-0"><span><b>Annie</b>: Chrome will test implementing both algorithms (with and without element removal), to see where there are dramatic differences and figure out which is best.</span><span class="c3">&nbsp; This will just be an internal tracking metric, not as part of RUM LCP timing.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Annie</b>: Do people prefer to have simpler algorithm for calculating LCP or something that is still work in all edge cases, i.e. splash screens/carousels/etc</span></li><li class="c0 li-bullet-0"><span class="c3">Nic, Alex, others: Lean towards a simpler API that can be explained cleanly. &nbsp;Advanced users / people needing something different can use ElementTiming.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Concerns around performance overhead of tracking all elements</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: Currently shipped in Chrome, and removing the element-removal-logic might make it less expensive (because you no longer have to keep a log of all previous largest-paints in case an element is later removed)</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ilya</b>: Timeline for outcome of experiment?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Annie</b>: ~2 months to get feedback</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ilya</b>: Circle-back around end of March (F2F?)</span></li></ul><p class="c4 c14"><span class="c3"></span></p><h2 class="c2" id="h.5ricf243r7v9"><span class="c7">isInputPending</span></h2><p class="c4"><span class="c9"><a class="c10" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/104Cypz8IHwyLNh1G0pqmezj3LZXjFmh9tNYDnJPOb1c/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1613234996806000&amp;usg=AOvVaw1mRp-uKVHyh4n1YvzEBtb3">Presentation</a></span></p><p class="c4 c14"><span class="c3"></span></p><p class="c4"><span class="c9"><a class="c10" href="https://www.google.com/url?q=https://www.chromestatus.com/feature/5719830432841728&amp;sa=D&amp;source=editors&amp;ust=1613234996807000&amp;usg=AOvVaw1N9P9p3UE1brNp3Jg0If7F">https://www.chromestatus.com/feature/5719830432841728</a></span></p><p class="c4"><span class="c9"><a class="c10" href="https://www.google.com/url?q=https://bugs.chromium.org/p/chromium/issues/detail?id%3D930987&amp;sa=D&amp;source=editors&amp;ust=1613234996807000&amp;usg=AOvVaw2gNEA7iPWROd8JSgkPsDAM">https://bugs.chromium.org/p/chromium/issues/detail?id=930987</a></span></p><p class="c4 c14"><span class="c3"></span></p><ul class="c12 lst-kix_rm58aqw1xfkx-0 start"><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: ran an Origin Trial and confirmed our hypothesis that this is helpful and presented at TPAC</span></li><li class="c0 li-bullet-0"><span class="c3">...: Spec changes from feedback post-TPAC</span></li><li class="c0 li-bullet-0"><span class="c3">...: Avoid filtering using DOM event types -- hard to spec, and not performant, so moving away from that in favor of a continous/discrete dichotomy</span></li><li class="c0 li-bullet-0"><span class="c3">...: Original API took in a list of strings to match each call, but when the browser had to do a lot of string matches -- for a API that can be called in quick succession, this isn't optimal. On top of that, the API used to be stateless, but the UA can benefit from knowing ahead of time is inInputPending will be called. So added an options object, that when it’s allocated, that can be used as a signal to the browser that isInputPending will soon be called and that it should warm up its prediction logic.</span></li><li class="c0 li-bullet-0"><span class="c3">...: Needed to prove viability of adhering to same-origin policy. Have a prototype in Chromium that’s based on compositor hit testing. Expect it not to introduce any kind of new click-jacking attack vectors. Same as existing renderer-based delegation.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: When you say SOP, who’s deciding which element gets the event?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: The hit testing logic for isInputPending has to run off main thread logic, by definition. This is tricky because the hit-testing for event dispatch is done on the main thread. We suggested that UAs will perform this based on the last frame displayed to the user. Can perform origin level attribution per frame, so a frame from a different origin doesn’t mistakenly receive events.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: That solves one problem but creates another. What happens if things have moved between the two hit testing occurances?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: Yeah, the frame that receives the inInputPending information is not guaranteed to be the same frame as the one that ends up handling the event?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: It is not. What we did is based on last frame presented to the user, which is not well-defined in spec. But event targeting in general is suffering from very similar issues.</span></li><li class="c0 li-bullet-0"><span class="c3">…: Imagine a site that blocks the main thread and moves frames around. The user may click on something, but the event may get dispatched to another frame than the one they thought</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: What’s “last frame presented to user”?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: We did hit testing based on browsing context. Those browsing contexts group event by origins. So if you have multiple frames from the same origin, isInputPending would return true for an event that occured in any one of them. So we can the scheduling properties that we want, and yield for anything that needs our main thread.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: That hit testing, regardless of isInputPending, that logic runs in the browser process? Top level renderer?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: In Chrome in the OT, we ran this in the browser process which only has partial knowledge of origins in browsing contexts. We now moved this to the renderer as well, so it’d work for Android and other situations where you have multiple same-site cross-origin frames in the same process.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: the discrepancy is an issue. We will not be comfortable implementing what you are proposing here, without solving the problem that it’s be sent to the wrong frame.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: Are you not suffering from this problem already with event dispatch? The main frame can block the main thread after rendering a frame, shuffle iframes around and cause events to be triggered on the wrong frame. It’s already a know clickjacking attack vector</span></li><li class="c0 li-bullet-0"><span class="c3">… Mitigations for this in Chromium include blocking event dispatch after frames have moved around, for a brief period of time</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: this case seems more problematic. With clickjacking the frame actually gets the event, but here we’d be reading events that are sent to a cross-origin frame. Will this also happen from an iframe?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: This will only happen when you have multiple nested browsing contexts per page. The attack I can imagine is when you click on a cross-origin iframe and move it away programatically. So from the time the event is dispatched to a post-layout time when the task is run, it’s no longer hitting where the user thought they are clicking. So you might think that you’re getting events that you don’t.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: so if the iframe doesn’t move, the hit testing is correct?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: yeah. The only concerns is those rare edge cases where iframes are moved</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Could also be a result of scrolling?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: Not for compositor-side scrolling</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: In Chrome, but not other engines. This is problematic. Just because there’s a current browser bug where this is an existing issue, doesn’t mean we can make it work. This proposal introduces a new security sensitive surface. So that needs to be carefully studied. What you’re currently proposing is not something we’d be comfortable implementing.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: There are possible mitigations. For sync scrolling, a scroll event that forced a frame to move won’t cause misattribution, because the main thread was blocked so the frame hasn’t yet moved. Can you walk me through an example?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: between the time the event was initiated and dispatched, scrolling may have happened, in WebKit’s case the UI process. Whatever iframe was there when the event was initiated may have moved by the time it was dispatched in the WebContents process. </span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: So user scrolls and clicks, the frame doesn’t update but the scroll process is, and it clicks on a different origin iframe. The parent of the iframe will receive an inInputPending call from that that would be incorrect, and will leak a cross-origin click.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: iframe could also incorrectly receive that information. The bigger issue here is that all this is very fuzzily defined in spec. Need to come up with model for how hit-testing works and what security mitigations are needed. Not OK to have a spec while saying “there are possible mitigations”. Need to clearly understand what mitigations need to be done, and what the security risk is.</span></li><li class="c0 li-bullet-0"><span><b>Andrew</b>: We wrote about it in the explainer. Most of the privacy and security section is discussing this: </span><span class="c9"><a class="c10" href="https://www.google.com/url?q=https://github.com/WICG/is-input-pending%23privacy-and-security&amp;sa=D&amp;source=editors&amp;ust=1613234996810000&amp;usg=AOvVaw18eIsXEWBSnyleAG_Ok_rB">https://github.com/WICG/is-input-pending#privacy-and-security</a></span></li><li class="c0 li-bullet-0"><span class="c3">… Need to think what actual attacks are possible with this, beyond philosophical SOP concerns. Maybe key events? But not likely since those are dispatched based on focus and not hit-testing.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: very unlikely is not good enough for security. Can’t hope for the best. This new security surface needs to be carefully studied.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: Can talk to Chrome security folks that looked into the API’s security</span></li><li class="c0 li-bullet-0"><span class="c3">...: AI to share the results of the Chrome security review</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Just because Chrome security thinks it’s OK doesn’t mean we would. </span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: A first good step would be to render the security discussion public, and then get Apple and Mozila to review and see if given your browser architecture, that result makes sense.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Not acceptable for the information to be different between isInputPending and event dispatch</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: That’s not going to be possible</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: then maybe it’s not implementable. Without this guaranty we cannot implement</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: Andrew - can you elaborate on why it won’t be possible?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: hit testing off-main-thread an on-main-thread can disagree due to queued tasks on the main thread. isInputPending is doing hit testing based on what the user sees, which seems more accurate</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: the browser has to send these events at some point, there must be a point in the browser process in which it knows which renderer to send it to</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: site isolation in Chrome suffers from the same issue and does sync hit-testing for edge cases</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: I agree with your statement that hit-testing for isInputPending is more accurate than hit testing done later on. But I’d expect the browser to not dispatch anything in case where those are different. We should dispatch the event to a frame that when the user didn’t intended for it to happen.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: In that scenario, you wouldn’t re-disptach events from one renderer to another. That would never happen. So why isn’t that always the case? Why don’t we make an early decision and lock the event to that frame?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: Locking?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: Run the event in the frame we originally thought it should go to</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: basically run hit testing once and then dispatch both isInputPending and the event based on that one result, that happened at a single point in time, instead of having it be racy.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: Not sure how that’s different from what I described. We do lock to a frame</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: yeah, but isInputPending can be assigned to the wrong frame. We’re trying to avoid leaking cross-origin information here.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: You won’t know that the target frame has changed until you spin the main thread.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: Yeah, but why would we change the target?</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: Because of a task that was queued on the main thread</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Frames don’t move from one process to another. Why don’t we just stick to the process which we decided earlier, regardless of tasks that ran in the meantime.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Nicolás</b>: Could also drop the event to the floor if the target changed. Both options seem like a solution to this problem.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: As a hacky mitigation, we could suppress the API if frames motion resulted in inconsistency</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: That would be too late</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: The locking behavior would require a fundamental change to how implementers do event dispatch</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: sure, but may be necessary in order to implement this</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: OK, useful feedback</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Request to get feedback from multiple engines, members of other working groups (e.g. HTML, WebApps, CSS) to help us better understand what may work for APIs like this when they require implementation feedback on hit-testing, security issues, etc</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Benjamin</b>: second that</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Yoav</b>: Maybe we can organize a cross-WG call to discuss this.</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Ryosuke</b>: maybe a GH issue can be sufficient</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: Will file for a TAG review</span></li><li class="c0 li-bullet-0"><span class="c3"><b>Andrew</b>: There were still a few more things to chat about but will follow up next meeting</span></li></ul><p class="c4 c14"><span class="c3"></span></p><p class="c4"><span class="c6"><b>Next Meeting</b>: Jan 30 2020 at 10am PST</span></p><p class="c4 c14"><span class="c3"></span></p></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjoyEuXgb19yW1D9JRS8yoFkoQ8zeF7bB23-lQUT_JnrVmdjE5-hDueYp-lf3npBexeBMQD6jaiJH8CVFobw:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>